package com.jt.common.interceptor;

import java.time.LocalTime;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * 框架设计
 */
//拦截器接口
interface HandlerInterceptor{
    default void before(){};
    default void after(){};
}
//处理器接口
interface Handler{
    void processed();
}

/**
 * 定义一个执行链
 * */
class ExecutionChain{
    //提供一些拦截器
    private List<HandlerInterceptor> interceptors = new CopyOnWriteArrayList<>();
    //业务处理器
    private Handler handler;

    //提供构造方法
    public ExecutionChain(List<HandlerInterceptor> interceptors, Handler handler) {
        this.interceptors.addAll(interceptors);
        this.handler = handler;
    }

    //负责执行业务的方法
    public void excute(){
        //1、before
        for (int i = 0; i < interceptors.size(); i++) {
            interceptors.get(i).before();
        }
        //2、processed
        handler.processed();
        //3、after
        for (int i = interceptors.size()-1; i >= 0 ; i--) {
            interceptors.get(i).after();
        }
    }
}

/**
 * 框架应用
 * */
public class FormworkTests {
    public static void main(String[] args) {
        /**
         * 应用拦截器
         * */
        //1、创建拦截器
        List<HandlerInterceptor> Interceptors = new CopyOnWriteArrayList<>();
        Interceptors.add(new HandlerInterceptor(){
            @Override
            public void before() {
                System.out.println("开始时间：" + LocalTime.now());
            }
            @Override
            public void after() {
                System.out.println("结束时间：" + LocalTime.now());
            }
        });
        //2、创建处理器
        Handler handler = new Handler() {
            @Override
            public void processed() {
                System.out.println("开始考试");
            }
        };
        //3、创建执行器
        ExecutionChain executionChain = new ExecutionChain(Interceptors, handler);
        //4、执行执行器
        executionChain.excute();
    }
}


